package org.g4studio.core.orm.xibatis.sqlmap.client.extensions;

import java.math.BigDecimal;
import java.net.URL;
import java.sql.*;
import java.util.Calendar;
import java.util.Map;

/**
 * Allows values to be retrieved from the underlying result set.
 * TypeHandlerCallback implementations use this interface to get values that
 * they can subsequently manipulate before having them returned. Each of these
 * methods has a corresponding method on the ResultSet (or CallableStatement)
 * class, the only difference being that there is no need to specify the column
 * name or index with these methods.
 * <p/>
 * <b>NOTE:</b> There is no need to implement this. The implementation will be
 * passed into the TypeHandlerCallback automatically.
 */
public interface ResultGetter {

	/**
	 * Gets an array from the underlying result set
	 * 
	 * @return - the array
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Array getArray() throws SQLException;

	/**
	 * Gets a BigDecimal from the underlying result set
	 * 
	 * @return - the BigDecimal
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public BigDecimal getBigDecimal() throws SQLException;

	/**
	 * Gets a Blob from the underlying result set
	 * 
	 * @return - the Blob
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Blob getBlob() throws SQLException;

	/**
	 * Gets a boolean from the underlying result set
	 * 
	 * @return - the boolean
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public boolean getBoolean() throws SQLException;

	/**
	 * Gets a byte from the underlying result set
	 * 
	 * @return - the byte
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public byte getByte() throws SQLException;

	/**
	 * Gets a byte[] from the underlying result set
	 * 
	 * @return - the byte[]
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public byte[] getBytes() throws SQLException;

	/**
	 * Gets a Clob from the underlying result set
	 * 
	 * @return - the Clob
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Clob getClob() throws SQLException;

	/**
	 * Gets a Date from the underlying result set
	 * 
	 * @return - the Date
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Date getDate() throws SQLException;

	/**
	 * Gets a Date from the underlying result set using a calendar
	 * 
	 * @param cal
	 *            - the Calendar
	 * @return - the Date
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Date getDate(Calendar cal) throws SQLException;

	/**
	 * Gets a double from the underlying result set
	 * 
	 * @return - the double
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public double getDouble() throws SQLException;

	/**
	 * Gets a float from the underlying result set
	 * 
	 * @return - the float
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public float getFloat() throws SQLException;

	/**
	 * Gets an int from the underlying result set
	 * 
	 * @return - the int
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public int getInt() throws SQLException;

	/**
	 * Gets a long from the underlying result set
	 * 
	 * @return - the long
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public long getLong() throws SQLException;

	/**
	 * Gets an Object from the underlying result set
	 * 
	 * @return - the Object
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Object getObject() throws SQLException;

	/**
	 * Gets an Object from the underlying result set using a Map
	 * 
	 * @param map
	 *            - the Map
	 * @return - the Object
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Object getObject(Map map) throws SQLException;

	/**
	 * Gets a Ref from the underlying result set
	 * 
	 * @return - the Ref
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Ref getRef() throws SQLException;

	/**
	 * Gets a short from the underlying result set
	 * 
	 * @return - the short
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public short getShort() throws SQLException;

	/**
	 * Gets a String from the underlying result set
	 * 
	 * @return - the String
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public String getString() throws SQLException;

	/**
	 * Gets a Time from the underlying result set
	 * 
	 * @return - the Time
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Time getTime() throws SQLException;

	/**
	 * Gets a Time from the underlying result set using a Calendar
	 * 
	 * @param cal
	 *            - the Calendar
	 * @return - the Time
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Time getTime(Calendar cal) throws SQLException;

	/**
	 * Gets a Timestamp from the underlying result set
	 * 
	 * @return - the Timestamp
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Timestamp getTimestamp() throws SQLException;

	/**
	 * Gets a Timestamp from the underlying result set
	 * 
	 * @param cal
	 *            - the Calendar
	 * @return - the Timestamp
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public Timestamp getTimestamp(Calendar cal) throws SQLException;

	/**
	 * Gets a URL from the underlying result set
	 * 
	 * @return - the URL
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public URL getURL() throws SQLException;

	/**
	 * Tells if the field was null
	 * 
	 * @return - true if it was null
	 * @throws SQLException
	 *             - if the underlying result set throws an exception
	 */
	public boolean wasNull() throws SQLException;

	/**
	 * Returns the underlying ResultSet...be careful!
	 * 
	 * @return a ResultSet instance.
	 */
	public ResultSet getResultSet();

	/**
	 * Returns the name of the column being got in the underlying ResultSet. May
	 * be <code>null</code> in which case the <code>getColumnIndex</code> method
	 * should be used.
	 * 
	 * @return the column name (may be null)
	 */
	public String getColumnName();

	/**
	 * Returns the index of the column being got in the underlying ResultSet.
	 * Only use this method if the value returned from
	 * <code>getColumnName</code> is null.
	 * 
	 * @return the index of the column (if zero then use the column name)
	 */
	public int getColumnIndex();
}
